import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase es el jugador Cube valida todo los efectos y colisiones del Objeto Cube.
 * En esta clase se utilizó un método del proyecto: Jump_fall - Autor: dangjavageek
 * @author Daniel Isaac Marmolejo Pereira
 * @version Final
 */ 
public class Cube extends Actor
{  
    private Mundo mundo;
    private static final int jumpStrength = 17;
    private int vSpeed = 0;  
    private Actor picon;
    private Actor hoyo;
    private Actor rocub;
    private Actor fin;
    private Actor escalon;
    private int vel=0;
    private boolean band=false;
    private boolean band2=false;

    /**
    * Llama a los metodos: checkKeys(), checkFall(), topaEnemigo().
    */
    public void act() 
    {
        checkKeys();        
        checkFall();
        topaEnemigo();
    }
    /**
     *Verifica que tecla se presionó.
     */
    private void checkKeys()
    {
        mundo=(Mundo)super.getWorld();
        Contador puntos=mundo.DamePuntos();
        if (Greenfoot.isKeyDown("space") )
        {
            if (onGround())
            {
                jump();
                puntos.incrementa();
            }
        }
        else if (Greenfoot.isKeyDown("left") )
        {
              if(!band)
                mueveDerecha();
        }
        else if (Greenfoot.isKeyDown("right") )
        {       
            if(!band)
                mueveIzquierda();
        }
    }    
     /**
     *Al presionar la tecla espacio y el método onGround() está en verdadero se activa este método que nada a llamar 
     *al método setVspeed(-jumpStreagth) que le manda una variable y llama al método fall().
     */
    private void jump()
    {
        band2=false;
        setVSpeed(-jumpStrength);
        fall();
    }
     /**
     *Posiciona el objeto en la altura de la caída.
     */
    private void checkFall()
    {
        if (onGround()) 
        {
            setVSpeed(0);
            if(getY()>300)
                setLocation(getX(),290);
            setRotation(0);
            band2=true;
        }
        else 
        {
            fall();
        }
    }
     /**
     *Checa si el objeto esta interceptado por un objeto de la clase piso.
     *@return verdadero o falso
     */
    public boolean onGround()
    {
        Object under = getOneIntersectingObject(Piso.class);
        return under != null;
    }
    /**
     * pasa la velocidad a otra variable.
     * @param velocidad
     */
    public void setVSpeed(int speed)
    {
        vSpeed = speed;
    }
    /**
     *Genera el efecto de caída y el de rotación.
     */
    public void fall()
    {
       if(!band2)
       setRotation(vSpeed*10);
       setLocation (getX(), getY()+vSpeed);
       vSpeed++;

    }
    /**
     * Mueve el jugador a la derecha
     */
    public void mueveDerecha()
    {
        mundo=(Mundo)super.getWorld();
        Piso piso=mundo.DamePiso();
        auxl auxl = mundo.DameAuxl();
        if(this.getX()>150)
        {
        setLocation(getX()-4,getY());
        piso.setLocation(piso.getX()-4,piso.getY());
        auxl.setLocation(auxl.getX()-4,auxl.getY());
        }
    }
     /**
     * Mueve el jugador a la izquierda.
     */
    public void mueveIzquierda()
    {
        mundo=(Mundo)super.getWorld();
         Piso piso=mundo.DamePiso();
         auxl auxl = mundo.DameAuxl();
        if(this.getX()<600)
        {
        setLocation(getX()+4,getY());
        piso.setLocation(piso.getX()+4,piso.getY());
        auxl.setLocation(auxl.getX()+4,auxl.getY());
        }
    }
     /**
     *Verifica si el jugador se topa con un enemigo para restarle vidas, iniciar de  nuevo y si las vidas es igual a cero muestra el mensaje pierde.
     */
    public void topaEnemigo()
    {
        mundo=(Mundo)super.getWorld();
        Contador vidas= mundo.DameVidas();
        Cube cube=mundo.jugador();
        picon=super.getOneIntersectingObject(Picon.class);
        hoyo=super.getOneIntersectingObject(Hoyo.class);
        rocub=super.getOneIntersectingObject(Rocub.class);
        fin=super.getOneIntersectingObject(Fin.class);
        escalon=super.getOneIntersectingObject(Escalon.class);
        if(picon!=null || hoyo!=null || rocub!=null || fin!=null  )
        {
               if(vidas.desincrementa()==0)
               {
                mundo.Perdiste();
               }
               else
               {
               this.pierdeVida(); 
               Greenfoot.delay(30);
               mundo.prepare();
              }
        }
        else if(escalon!=null)
        {
        this.mover(vel);
        band=true;
        if(cube.getY()> 295 &&  escalon.getX()-15>cube.getX())
            cube.setLocation(escalon.getX()-50,cube.getY());
        }
        else
        band=false;
    }
    /**
     * Genera el mensage Pierde
     */
    public void pierdeVida()
    {
        mundo=(Mundo)super.getWorld();
        Contador puntos=mundo.DamePuntos();
        puntos= new Contador("Puntos: ",0);
        mundo.letrero("PERDISTE");
    }
    /**
     * mueve al jugador a la velocidad a como se mueve el mundo.
     * @param  Velocidad
     */
    public void mover(int v)
    {
    mundo=(Mundo)super.getWorld();
    Piso piso=mundo.DamePiso();
    auxl auxl = mundo.DameAuxl();
    setLocation(getX()-v,getY());
    piso.setLocation(piso.getX()-v,piso.getY());
    auxl.setLocation(auxl.getX()-v,auxl.getY());
    }
    /**
     * Iguala la velocidad a x
     * @param velocidad.
     */
    public void vel(int x)
    {
        vel=x;
    }
}
   